#ifndef NUMERICALINTEGRATOR_H
#define NUMERICALINTEGRATOR_H

#include <vector>
#include <stdexcept>
#include <cmath>
#include <algorithm>
#include <QString>

class NumericalIntegrator
{
public:
    enum IntegrationMethod {
        TrapezoidalRule,    // 梯形法则
        SimpsonsRule,       // 辛普森法则（需要等间距奇数点）
        BoolesRule          // 布尔法则（更高精度）
    };

    // 计算积分面积
    static double calculateArea(const std::vector<double>& x,
                                const std::vector<double>& y,
                                IntegrationMethod method = TrapezoidalRule);

    // 验证数据有效性
    static bool validateData(const std::vector<double>& x,
                             const std::vector<double>& y,
                             QString& errorMessage);

    // 检查是否等间距
    static bool isEquallySpaced(const std::vector<double>& x, double tolerance = 1e-10);

private:
    // 各种积分方法的实现
    static double trapezoidalRule(const std::vector<double>& x, const std::vector<double>& y);
    static double simpsonsRule(const std::vector<double>& x, const std::vector<double>& y);
    static double boolesRule(const std::vector<double>& x, const std::vector<double>& y);

    // 线性插值函数
    static double linearInterpolation(const std::vector<double>& x,
                                      const std::vector<double>& y,
                                      double targetX);
};

#endif // NUMERICALINTEGRATOR_H
